#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

#include "stack_using_linked_list.h"


ListNode *createListNode(int data){
    ListNode *tmp=(ListNode *)malloc(sizeof(ListNode));
    tmp->data=data;
    tmp->link=NULL;
    return tmp;
}

void push(ListNode **top,int data){
    if(*top==NULL){
        *top=createListNode(data);
    }
    else{
        ListNode *tmp=createListNode(data);
        if(tmp==NULL){
            printf("Out of memory/Stack full");
            return;
        }
        tmp->link=*top;
        *top=tmp;
    }

}

int pop(struct ListNode **top){
    if(*top==NULL){
        printf("Stack empty!");
        return INT_MIN;
    }
    ListNode *t=*top;
    int data=t->data;
    ListNode *tmp=*top;
    *top=tmp->link;
    free(tmp);
    return data;
}

int length(ListNode **top){
    if(*top==NULL){
        return 0;
    }
    ListNode *tmp=*top;
    int count=0;
    while(tmp!=NULL)
    {
        count=count+1;
        tmp=tmp->link;
    }
    return count;
}

void deleteStack(struct ListNode **top){
    ListNode *tmp=NULL;
    while(*top!=NULL){
        tmp=*top;
        ListNode *t=*top;
        *top=t->link;
        free(tmp);
    }
}

